Debido a la naturaleza científica de este trabajo, inicialmente fue necesario realizar un proceso de investigación y de aprendizaje exhaustivo. Como se ha explicado anteriormente, nuestro trabajo es una extensión de \cite{flops2010} (ver \cite{prole2012}), en cual se propone la reducción del problema de generación de casos de prueba a un problema de resolución de restricciones. Así, nos encontramos con dos nuevos frentes sobre los que realizar una tarea de investigación: casos de prueba y programación basada en restricciones. 

En cuanto al tema de generación de casos de prueba, es una área con la que habíamos tenido contacto previo, gracias a que en asignaturas de cursos anteriores se propuso la implementación de estos, para después ejecutarlos sobre las prácticas de laboratorio realizadas. Sin embargo, este conocimiento sobre lo que es un caso de prueba era bastante limitado, y era necesario realizar un estudio intenso para tener un conocimiento más profundo y específico de la problemática estudiada. 

Por el contrario, la programación basada en restricciones \cite{MarStu:CP98} era un área totalmente inexplorada para nosotros. Esto supuso un gran reto, pues debimos rescatar lo estudiado en asignaturas de primer curso, como Matemática Discreta y Lógica Matemática, así como nociones de algoritmia de Metodología y Tecnología de la Programación para tener un conocimiento claro de qué significan las fórmulas lógicas de primer orden que representan las restricciones y el algoritmo de generación de estas, propuesto en \cite{flops2010} y extendido en \cite{prole2012} para consultas existenciales anidadas. El aprendizaje en estas áreas se vio apoyado por las periódicas reuniones que mantuvimos en esta primera fase del proyecto, en las cuales tratamos de resolver dudas que nos surgían durante el proceso de estudio de la teoría de \cite{flops2010}.

Por último, y sin olvidar el objetivo final de este trabajo, los casos de prueba surgen de la resolución de las fórmulas de primer orden que representan las restricciones de una tabla o vista SQL. Para poder resolver estas fórmulas se nos propuso utilizar Gecode, un reputado resolutor de restricciones \cite{Gecode}. Gecode (generic constraint development environment) es una herramienta libre, desarrollada en C++ para el desarrollo de sistemas basados en restricciones, que incluye un resolutor de gran rendimiento a la vez que es modular y extensible. De esta forma, paralelamente a los dos frentes de investigación que ya teníamos abiertos, comenzamos un proceso de aprendizaje sobre Gecode, sus posibles usos, y conexiones con nuestra herramienta.

Pronto nos dimos cuenta que esta fase de investigación llevaría más tiempo del que en un principio habíamos estimado. El motivo fue que la teoría expuesta en \cite{flops2010} y la herramienta Gecode \cite{Gecode}, no son en absoluto triviales, lo que hizo que empezara a retrasarse el comienzo de la implementación de la herramienta que exponemos. En esta situación, decidimos realizar una planificación del desarrollo, que a continuación detallamos.
